#pragma once

namespace byh
{
	template<class Iterator, class Ref, class Ptr>
	class ReverseIterator
	{
	public:
		ReverseIterator(Iterator it)
			:_it(it)
		{}

		Ref operator*()
		{
			Iterator temp = _it;
			return *(--temp);
		}

		Ptr operator->()
		{
			return &(operator*());
		}

		ReverseIterator& operator++()
		{
			--_it;
			return *this;
		}

		ReverseIterator& operator--()
		{
			++_it;
			return *this;
		}

		bool operator!=(const ReverseIterator& rit)
		{
			return _it != rit._it;
		}

	private:
		Iterator _it;
	};
}
